مشخصات مقاله
-
2508
-
0.0
-
6423
-
0
-
0
آموزش استفاده از کتابخانه Otto event bus در اندروید
این فصل از سری مقاله های آموزشی اندروید، استفاده از کتابخانه ی Otto event bus و کاربرد آن در اندروید را به شما آموزش می دهد.
فهرست محتوا
1.Otto چیست؟
- نصب
- چه زمانی باید از Otto استفاده کرد؟
- چگونه باید Otto را راه اندازی کرد؟
- چگونه باید برای رویدادها ثبت نام کرده یا ثبت آن را لغو کرد؟
- چگونگی ارسال رخدادها
- چگونه مولفه ها / کامپوننت های جدید می توانند آخرین رویداد را دریافت کنند؟
2. تمرین : بکاربردن Otto event bus system
Otto چیست؟
یک پروژه ی منبع آزاد است که به منظور ارائه ی پیاده سازی event bus طراحی شده تا بدین وسیله مولفه ها بتوانند رخدادها را منتشر کرده و با آن ها اشتراک پیدا کنند (publish/subscribe).
Otto شاخه ای از کتابخانه ی event bus Guava بوده و به منظور پشتیبانی از اندروید به بهترین روش، دوباره و از نو طراحی شده. درست برخلاف Guava event bus، Otto، عضویت در رخداد event subscription / از جانب کلاس های پایه یا رابط ها را موجب افزایش کارایی کتابخانه ی مورد نظر ندانسته و همچنین در حفظ سادگی و غیرمبهم بودن کدهای برنامه آن ها را کارامد در نظر نمی گیرد.
نصب
استفاده از این کتابخانه در اندروید و جاوا بسیار ساده است، تنها کافی است JAR را از Download Otto دریافت کرده، سپس آن را به classpath برنامه ی خود اضافه کنید.
در صورت استفاده از Maven و Gradle به عنوان build system، کافی است یک dependency به شناسه ی گروه (group/ id) com.squareup، artifactId otto اضافه کنید.
چه زمانی باید از Otto استفاده کرد؟
Otto یک وسیله ی بسیار مناسب برای برقراری ارتباط بین activity و fragment یا activity و service محسوب می شود.
چگونه باید Otto را راه اندازی کرد؟
جهت استفاده از Otto، یک نمونه ی (instance) منحصر بفرد از کلاس Bus ایجاد کرده و امکان دسترسی به آن را برای مولفه های اندروید فراهم کنید. این امر به طور معمول در شی Application برنامه ی اندروید انجام می گیرد.
public static Bus bus = new Bus(ThreadEnforcer.MAIN);
در مثال بالا پارامتر ThreadEnforcer.MAIN بکار گرفته شده. در این مورد خاص Otto، کاری می کند که رخدادها تنها از نخ اصلی فرستاده شوند. اگر می خواهید رویدادها از هر نخی فرستاده شود، در آن صورت باید از پارامتر ThreadEnforcer.MAIN استفاده کنید.
چگونه باید برای رویدادها ثبت نام کرده یا ثبت آن را لغو کرد؟
ثبت رخداد (event registration) با استفاده از حاشیه نویسی / annotation @Subcribe در یک متد تک پارامتری عمومی (public single parameter method) انجام می شود. پارامتر متد در واقع کلید رخداد (event key) است، برای مثال اگر چنین نوع داده ای به وسیله ی Otto event bus ارسال گردد، در آن صورت متد مورد نظر فراخوانده می شود.
دریافت کننده های رخداد (event receiver) ثبت (registration) را باید از طریق متد register مشتق از کلاس Bus انجام دهد.
// subscribe for string messages
@Subscribe
public void getMessage(String s) {
Toast.makeText(this، s، Toast.LENGTH_LONG).show();
}
//subscribe for TestData messages
@Subscribe
public void getMessage(TestData data) {
Toast.makeText(getActivity()، data.message، Toast.LENGTH_LONG).show();
}
//requires a registration e.g. in the onCreate method
bus.register(this);
جهت لغو ثبت نیز کافی است از تابع unregister() بهره بگیرید.
چگونگی ارسال رخدادها
به منظور ارسال رخدادها، می توان تابع post() از کلاس Bus را فراخوانی کرد.
· // post a string object
bus.post("Hello");
// example data to post
public class TestData {
public String message;
}
// post this data
bus.post(new TestData().message="Hello from the activity");
چگونه مولفه ها / کامپوننت های جدید می توانند آخرین رویداد را دریافت کنند؟
چنانچه لازم است مولفه های جدید، مانند fragment ی که به صورت پویا (dynamic) ایجاد شده باشد، داده های رخداد (event data) را حین ایجاد دریافت کنند، در آن صورت کامپوننت های جدید می توانند خود را به عنوان producer برای چنین داده های رخدادی ثبت (رجیستر) کنند. این کار با استفاده از حاشیه نویسی annotation @Produce امکان پذیر می باشد.
دریافت کننده ی رخداد باید ثبت را از طریق متد register مشتق از کلاس Bus انجام دهد.
@Produce
public String produceEvent() {
return "Starting up";
}
تمرین : بکاربردن Otto event bus system
در این بخش مثالی از کاربرد Otto در برنامه های اندروید ارائه شده است. توجه داشته باشید که این کتابخانه را همچنین می توان در اپلیکیشن های استاندارد جاوا مورد استفاده قرار داد.
یک پروژه ی جدید اندروید به نام com.tahlildadeh.java.library.otto مبتنی بر قالب template Activity with Fragment ایجاد کنید.
در صورت استفاده از محیط برنامه نویسی Eclipse، Otto JAR را دانلود کرده و آن ها را به build path پروژه ی خود اضافه کنید.
رای کاربران Gradle، تنها لازم است dependency به فایل build.gradle اضافه گردد.
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.example.android.rssreader"
minSdkVersion 22
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt')، 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar']، dir: 'libs')
compile project(':com.example.android.rssfeedlibrary')
compile 'com.squareup:otto:1.3.5'
compile 'org.achartengine:achartengine:1.2.0'
فایل طرح بندی / activity_main.xml اکتیویتی باید مشابه مثال زیر باشد
فایل طرح بندی fragment_main.xml فرگمنت باید شبیه به نمونه ی زیر باشد.
یک fragment به صورت پویا (dynamic) به activity خود اضافه کنید. حال یک رخداد از fragment مربوطه به activity ارسال کرده، سپس این فرایند را به طور معکوس نیز انجام دهید. همچنین در هر دو مورد یک پیام Toast نشان دهید.
package com.vogella.android.otto;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.squareup.otto.Bus;
import com.squareup.otto.Produce;
import com.squareup.otto.Subscribe;
import com.squareup.otto.ThreadEnforcer;
import library.java.vogella.com.otto.R;
public class MainActivity extends Activity {
public static Bus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction().add(R.id.container، new PlaceholderFragment()).commit();
}
bus = new Bus(ThreadEnforcer.MAIN);
bus.register(this);
}
@Subscribe
public void getMessage(String s) {
Toast.makeText(this، s، Toast.LENGTH_LONG).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main، menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
TestData t = new TestData();
t.message="Hello from the activity";
bus.post(t);
return true;
}
return super.onOptionsItemSelected(item);
}
public class TestData {
public String message;
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater، ViewGroup container، Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main، container، false);
View button = rootView.findViewById(R.id.fragmentbutton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bus.post("Hello from the Fragment");
}
});
bus.register(this);
return rootView;
}
@Subscribe
public void getMessage(MainActivity.TestData data) {
Toast.makeText(getActivity()، data.message، Toast.LENGTH_LONG).show();
}
}
@Produce
public String produceEvent() {
return "Starting up";
}
}
توجه:
مثال بالا به منظور رسیدن به مقاصد آموزشی عمدا ساده طراحی شده است. باید در نظر داشته باشید که در یک برنامه ی کاربردی واقعی یک Bus منحصر بفرد در کلاس Application ایجاد می گردد و fragment نیز در فایل مختص به خود قرار دارد.